原始题目:剑指 Offer 10- II. 青蛙跳台阶问题 (opens new window)
解题思路:
设跳上 级台阶可能有 中可能性,当青蛙跳到最后的时候,会有两种情况,一种是跳 级,一种是跳 级。
- 当为 级的时候,剩下的 级台阶有 种跳法。
- 当为 级的时候,剩下的 级台阶有 种跳法。
因此很容易得到递推式
其递推性质为斐波那契数列,因此本题可以转化为斐波那契数列求第 n 项的做法。不同的是初始条件不同
- 本题的初始条件为 。
- 斐波那契数列初始条件为 。
因此可以使用动态规划来接题。
代码:
public int numWays(int n) {
if (n == 0 || n == 1) {
return 1;
}
int a = 1;
int b = 1;
int sum = 0;
while(--n > 0){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return sum;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
复杂度分析
时间复杂度:需要进行 次循环,每次循环的操作是 的。
空间复杂度:使用常数级的空间。